#重写系统提供的函数，返回多个字段
import re

from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

from user.models import User


def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据
    """
    return {
        'token':token,
        'user_id':user.id,
        'username':user.username,
    }


#添加功能，手机号也能登录
def get_user_by_account(username):
    """
    根据账号获取user对象
    :param username: 账号，可以是用户名也可以时手机号
    :return: user对象或者none
    """
    try:
        if re.match('^1[3-9]\d{9}$', username):
            #账号为手机号
            user = User.objects.get(mobile=username)
        else:
            #账号为用户名
            user = User.objects.get(username=username)
    except User.DoesNotExist:
        return None
    else:
        return user


#重写函数，解决使用mobile登录问题
class UsernameMobileAuthBackend(ModelBackend):
    """
    我们自定义一个类，继承自ModelBackend,
    在这个类中，重写authenticate方法
    自定义用户名或者手机号认证
    """

    #重写authenticate
    def authenticate(self, request, username=None, password=None, **kwargs):
        #增加判断手机号或者是用户名判断：
        # user = get_user_by_account(username)
        # if user is not None and user.check_password(password):
        #     return user
        try:
            user = User.objects.get(Q(username=username) | Q(mobile=username))
        except User.DoesNotExist:
            return None

        if user.check_password(password):
            return user

